package refactortips.editors.refactorings;

import org.eclipse.swt.SWT;
import org.eclipse.swt.browser.Browser;
import org.eclipse.swt.custom.ScrolledComposite;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Link;
import org.eclipse.swt.widgets.TabFolder;
import org.eclipse.swt.widgets.TabItem;
import org.eclipse.ui.forms.widgets.Form;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.wb.swt.ResourceManager;
import org.eclipse.wb.swt.SWTResourceManager;

import refactortips.editors.AbstractRefactorTipsEditor;
import refactortips.editors.CommandMouseAdapter;

public class ExtractInterfaceEditor extends AbstractRefactorTipsEditor {

	protected final FormToolkit formToolkit = new FormToolkit(Display.getDefault());
	
	public ExtractInterfaceEditor() {
	}

	/**
	 * Create contents of the editor part.
	 * @param parent
	 */
	@Override
	public void createPartControl(Composite parent) {
		
		Form frmRefactoring = formToolkit.createForm(parent);
		formToolkit.paintBordersFor(frmRefactoring);
		frmRefactoring.setText("Extract Interface");
		frmRefactoring.getBody().setLayout(new FillLayout(SWT.HORIZONTAL));
		
		TabFolder tabFolder = new TabFolder(frmRefactoring.getBody(), SWT.NONE);
		formToolkit.adapt(tabFolder);
		formToolkit.paintBordersFor(tabFolder);
		
		ScrolledComposite sc = new ScrolledComposite(tabFolder, SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
		sc.setExpandHorizontal(true);
	    sc.setExpandVertical(true);
		
		TabItem tbtmDescription = new TabItem(tabFolder, SWT.NONE);
		tbtmDescription.setText("Descri\u00E7\u00E3o");
		
		ScrolledComposite scrolledComposite = new ScrolledComposite(tabFolder, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
		tbtmDescription.setControl(scrolledComposite);
		formToolkit.paintBordersFor(scrolledComposite);
		scrolledComposite.setExpandHorizontal(true);
		scrolledComposite.setExpandVertical(true);
		
		Composite composite_3 = new Composite(scrolledComposite, SWT.NONE);
		formToolkit.adapt(composite_3);
		formToolkit.paintBordersFor(composite_3);
		composite_3.setLayout(null);
		
		Label lblDescription = new Label(composite_3, SWT.NONE);
		lblDescription.setBounds(10, 10, 102, 25);
		lblDescription.setForeground(SWTResourceManager.getColor(SWT.COLOR_BLACK));
		lblDescription.setFont(SWTResourceManager.getFont("Segoe UI", 14, SWT.BOLD));
		formToolkit.adapt(lblDescription, true, true);
		lblDescription.setText("Descri\u00E7\u00E3o");
		
		Link linkExtractSuperclass = new Link(composite_3, SWT.NONE);
		linkExtractSuperclass.setBounds(334, 513, 124, 21);
		linkExtractSuperclass.setFont(SWTResourceManager.getFont("Segoe UI", 12, SWT.NORMAL));
		formToolkit.adapt(linkExtractSuperclass, true, true);
		linkExtractSuperclass.setText("<a>Extract Superclass</a>");
		
		Link linkDuplicateCode = new Link(composite_3, 0);
		linkDuplicateCode.setText("<a>Duplicate Code</a>");
		linkDuplicateCode.setFont(SWTResourceManager.getFont("Segoe UI", 12, SWT.NORMAL));
		linkDuplicateCode.setBounds(39, 556, 105, 21);
		formToolkit.adapt(linkDuplicateCode, true, true);
		
		Link linkExtractSuperclass2 = new Link(composite_3, 0);
		linkExtractSuperclass2.setText("<a>Extract Superclass</a>");
		linkExtractSuperclass2.setFont(SWTResourceManager.getFont("Segoe UI", 12, SWT.NORMAL));
		linkExtractSuperclass2.setBounds(642, 576, 124, 21);
		formToolkit.adapt(linkExtractSuperclass2, true, true);
		
		Link linkExtractClass = new Link(composite_3, 0);
		linkExtractClass.setText("<a>Extract Class</a>");
		linkExtractClass.setFont(SWTResourceManager.getFont("Segoe UI", 12, SWT.NORMAL));
		linkExtractClass.addMouseListener(new CommandMouseAdapter(getSite(), "RefactorTips.commands.extractClassCommand"));
		linkExtractClass.setBounds(462, 556, 86, 21);
		formToolkit.adapt(linkExtractClass, true, true);
		
		Label lblVriosClientesUsam = new Label(composite_3, SWT.NONE);
		lblVriosClientesUsam.setText("V\u00E1rios clientes usam o mesmo subconjunto de uma interface de uma classe, ou duas classes possuem parte de suas interfaces em comum.\r\nExtraia o subconjunto em uma interface.");
		lblVriosClientesUsam.setFont(SWTResourceManager.getFont("Segoe UI", 12, SWT.NORMAL));
		lblVriosClientesUsam.setAlignment(SWT.CENTER);
		lblVriosClientesUsam.setBounds(115, 72, 602, 63);
		formToolkit.adapt(lblVriosClientesUsam, true, true);
		
		Label label_1 = new Label(composite_3, SWT.NONE);
		label_1.setText("Motiva\u00E7\u00E3o");
		label_1.setFont(SWTResourceManager.getFont("Segoe UI", 14, SWT.BOLD));
		label_1.setBounds(10, 184, 98, 25);
		formToolkit.adapt(label_1, true, true);
		
		StyledText styledText = new StyledText(composite_3, SWT.READ_ONLY | SWT.WRAP);
		styledText.setText("\t\tClasses usam umas as outras de v\u00E1rias maneiras. O uso de uma classe normalmente abrange toda a \u00E1rea de responsabilidades de uma classe. Outro caso \u00E9 o uso de apenas um subconjunto particular das responsabilidades de uma classe por um grupo de clientes. Outro \u00E9 que a classe precisa trabalhar com qualquer classe que pode lidar com certas requisi\u00E7\u00F5es.");
		styledText.setJustify(true);
		styledText.setFont(SWTResourceManager.getFont("Segoe UI", 12, SWT.NORMAL));
		styledText.setEnabled(false);
		styledText.setDoubleClickEnabled(false);
		styledText.setBounds(29, 224, 803, 98);
		formToolkit.adapt(styledText);
		formToolkit.paintBordersFor(styledText);
		
		StyledText styledText_1 = new StyledText(composite_3, SWT.READ_ONLY | SWT.WRAP);
		styledText_1.setText("\t\tPara os dois \u00FAltimos casos, normalmente \u00E9 \u00FAtil fazer com que o subconjunto de responsabilidades seja algo por si s\u00F3, para que ela se torne mais clara no uso do sistema. Dessa forma \u00E9 mais f\u00E1cil ver como as reponsabilidades se dividem Se novas classes s\u00E3o necess\u00E1rias para dar suporte ao subconjunto, \u00E9 mais f\u00E1cil ver exatamente o que se encaixa no subconjunto.");
		styledText_1.setJustify(true);
		styledText_1.setFont(SWTResourceManager.getFont("Segoe UI", 12, SWT.NORMAL));
		styledText_1.setEnabled(false);
		styledText_1.setDoubleClickEnabled(false);
		styledText_1.setBounds(29, 315, 803, 93);
		formToolkit.adapt(styledText_1);
		formToolkit.paintBordersFor(styledText_1);
		
		StyledText styledText_2 = new StyledText(composite_3, SWT.READ_ONLY | SWT.WRAP);
		styledText_2.setText("\t\tEm v\u00E1rias linguagens orientadas a objeto, essa capacidade \u00E9 suportada por m\u00FAltiplas heran\u00E7as. Voc\u00EA cria uma classe para cada segmento de comportamento e combina elas em uma implementa\u00E7\u00E3o. Java possui heran\u00E7a \u00FAnica mas permite que voc\u00EA declare e implemente esse tipo de requisito usando interfaces. Interfaces tem tido uma grande influ\u00EAncia na maneira que programadores projetam programas Java. At\u00E9 mesmo programadores Smalltalk acham que interfaces s\u00E3o um avan\u00E7o!");
		styledText_2.setJustify(true);
		styledText_2.setFont(SWTResourceManager.getFont("Segoe UI", 12, SWT.NORMAL));
		styledText_2.setEnabled(false);
		styledText_2.setDoubleClickEnabled(false);
		styledText_2.setBounds(29, 404, 803, 113);
		formToolkit.adapt(styledText_2);
		formToolkit.paintBordersFor(styledText_2);
		
		Label label_2 = new Label(composite_3, SWT.NONE);
		label_2.setText("Atalho");
		label_2.setFont(SWTResourceManager.getFont("Segoe UI", 14, SWT.BOLD));
		label_2.setBounds(10, 855, 78, 42);
		formToolkit.adapt(label_2, true, true);
		
		Label label_3 = new Label(composite_3, SWT.NONE);
		label_3.setText("Abra uma classe e pressione");
		label_3.setFont(SWTResourceManager.getFont("Segoe UI", 12, SWT.NORMAL));
		label_3.setAlignment(SWT.CENTER);
		label_3.setBounds(94, 858, 234, 21);
		formToolkit.adapt(label_3, true, true);
		
		Label lblAltShift = new Label(composite_3, SWT.NONE);
		lblAltShift.setText("Alt + Shift + T -> E");
		lblAltShift.setFont(SWTResourceManager.getFont("Segoe UI", 12, SWT.BOLD));
		lblAltShift.setAlignment(SWT.CENTER);
		lblAltShift.setBounds(344, 858, 140, 21);
		formToolkit.adapt(lblAltShift, true, true);
		
		StyledText styledText_3 = new StyledText(composite_3, SWT.READ_ONLY | SWT.WRAP);
		styledText_3.setText("\t\tExiste algumas similaridades entre \t\t\t\t\t\t\t\t\t e Extract Interface. Extract Interface pode apenas apresentar interfaces comuns, mas n\u00E3o c\u00F3digo comum. Usar Extract Interface pode levar para mau cheiro de \t\t\t\t\t\t\t\t. Voc\u00EA pode reduzir esse problema usando \t\t\t\t\t\t\tpara colocar o comportamento em um componente e delegar para ele. Se existe um comportamento comum substancial \t\t\t\t\t\t\t\t   \u00E9 mais simples, mas voc\u00EA so pode ter uma superclasse.");
		styledText_3.setJustify(true);
		styledText_3.setFont(SWTResourceManager.getFont("Segoe UI", 12, SWT.NORMAL));
		styledText_3.setEnabled(false);
		styledText_3.setDoubleClickEnabled(false);
		styledText_3.setBounds(29, 513, 803, 113);
		formToolkit.adapt(styledText_3);
		formToolkit.paintBordersFor(styledText_3);
		
		StyledText styledText_4 = new StyledText(composite_3, SWT.READ_ONLY | SWT.WRAP);
		styledText_4.setText("\t\tInterfaces s\u00E3o boas para usar quando uma classe possui pap\u00E9is distintos em situa\u00E7\u00F5es diferentes. Use Extract Interface para cada papel. Outro caso \u00FAtil \u00E9 quando voc\u00EA quer descrever a interface de sa\u00EDda de uma classe, isto \u00E9, as opera\u00E7\u00F5es que uma classe faz no seu servidor. Se voc\u00EA quiser permitir outros tipos de servidores no futuro, tudo o que precisam fazer \u00E9 implementar a interface.");
		styledText_4.setJustify(true);
		styledText_4.setFont(SWTResourceManager.getFont("Segoe UI", 12, SWT.NORMAL));
		styledText_4.setEnabled(false);
		styledText_4.setDoubleClickEnabled(false);
		styledText_4.setBounds(29, 625, 803, 93);
		formToolkit.adapt(styledText_4);
		formToolkit.paintBordersFor(styledText_4);
		scrolledComposite.setContent(composite_3);
		scrolledComposite.setMinSize(composite_3.computeSize(SWT.DEFAULT, SWT.DEFAULT));
		
		TabItem tbtmUsage = new TabItem(tabFolder, SWT.NONE);
		tbtmUsage.setText("Exemplo");
		
		ScrolledComposite scrolledComposite_1 = new ScrolledComposite(tabFolder, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
		tbtmUsage.setControl(scrolledComposite_1);
		formToolkit.paintBordersFor(scrolledComposite_1);
		scrolledComposite_1.setExpandHorizontal(true);
		scrolledComposite_1.setExpandVertical(true);
		
		Composite composite = new Composite(scrolledComposite_1, SWT.NONE);
		formToolkit.adapt(composite);
		formToolkit.paintBordersFor(composite);
		
		Label label = new Label(composite, SWT.NONE);
		label.setImage(ResourceManager.getPluginImage("RefactorTips", "images/refactor/extractInterface/extractInterfaceSample1.1.png"));
		label.setBounds(63, 74, 215, 202);
		formToolkit.adapt(label, true, true);
		
		Label label_4 = new Label(composite, SWT.NONE);
		label_4.setImage(ResourceManager.getPluginImage("RefactorTips", "images/rightPointer.png"));
		label_4.setBounds(284, 157, 66, 36);
		formToolkit.adapt(label_4, true, true);
		
		Label label_5 = new Label(composite, SWT.NONE);
		label_5.setImage(ResourceManager.getPluginImage("RefactorTips", "images/refactor/extractInterface/extractInterfaceSample1.2.png"));
		label_5.setBounds(356, 93, 483, 166);
		formToolkit.adapt(label_5, true, true);
		scrolledComposite_1.setContent(composite);
		scrolledComposite_1.setMinSize(composite.computeSize(SWT.DEFAULT, SWT.DEFAULT));
		
		TabItem tbtmVideo = new TabItem(tabFolder, SWT.NONE);
		tbtmVideo.setText("Video");
		
		Browser browser = new Browser(tabFolder, SWT.NONE);
		browser.setUrl("www.youtube.com/embed/5rnTltUyIEs");
		tbtmVideo.setControl(browser);
		formToolkit.paintBordersFor(browser);
	}
}
